import {Injectable} from "@angular/core";
import {constructDependencies} from "@angular/core/src/di/reflective_provider";

@Injectable()
export class OcxhelpService {


  /**
   * 初始化控件
   * @param ocx
   * @param {number} ocx_w
   * @param {number} ocx_h
   * @param {number} wnum
   * @returns {any}
   */
  public iniOcx(ocx: any, ocx_w: number, ocx_h: number, wnum: number): any {
    try {
      ocx.width = ocx_w + "px";
      ocx.height = ocx_h + "px";
      ocx.intWidth = ocx_w;
      ocx.intHeight = ocx_h;
      ocx.apiSetView(wnum);
      ocx.bIsUseTitle = 0; //是否启用字符叠加功能（播放画面叠加自定义字符串）   0-不启用；1-启用
      ocx.intIsMenuOn = 1; //设置是否启用控件菜单功能  0-不启；1-启用。
      ocx.bCustomMenuOn = 0; //设置是否启用自定义菜单功能 0-不启；1-启用；必须在 intIsMenuOn 开启 状态下才生效
      ocx.intHxNptStatus = 0;
      ocx.strHxNptIp = "";
      ocx.strPicSaveDir = "C:"; //截图保存路径
      ocx.strFileSaveDir = "C:"; //录像保存路径
      ocx.intRClkbtnShow = 63;
      ocx.bIsShowCapture = 0; //右键菜单截图是否弹出窗口显示当前截图  0-否；1-是
      ocx.apiSetTitleFont(0.1, 0.8, 255, "微软雅黑", -29, 500, 3, 0, 0); //设置叠加自定义字符串的显示位置、字体、颜色等信息
      ocx.apiEnableRealCache(1, 30); //启用、禁用实时流缓存功能   1-启用；0-禁用  实时流缓存时间设置，单位：秒；最多不超过 60 秒
      ocx.intIsFullOnDblclk = 1;   //启用双击播放器全屏  默认0不启用
      ocx.intIsAsyncOpenReal = 1;  //启用异步模式打开实时流,0-同步模式,1-异步
      ocx.intIsEnableLogo = 0;         // 启用LOGO   默认0
      ocx.intIsEnableLoading = 0;      // 启用加载中动图效果  默认0
      return ocx;
    } catch (e) {
      console.warn("iniOcx", e);
      return null;
    }
  }

  /**
   * 初始化控件---大屏
   * @param ocx
   * @param {number} ocx_w
   * @param {number} ocx_h
   * @param {number} ocxint_w
   * @param {number} ocxint_h
   * @param {number} wnum
   * @returns {any}
   */
  public initOcx_ys(ocx: any, ocx_w: number, ocx_h: number, ocxint_w: number, ocxint_h: number, wnum: number): any {
    try {
      ocx.width = ocx_w;
      ocx.height = ocx_h;
      ocx.intWidth = ocxint_w;
      ocx.intHeight = ocxint_h;
      ocx.apiSetView(wnum);
      ocx.bIsUseTitle = 0; //是否启用字符叠加功能（播放画面叠加自定义字符串）   0-不启用；1-启用
      ocx.intIsMenuOn = 1; //设置是否启用控件菜单功能  0-不启；1-启用。
      ocx.bCustomMenuOn = 0; //设置是否启用自定义菜单功能 0-不启；1-启用；必须在 intIsMenuOn 开启 状态下才生效
      ocx.intHxNptStatus = 0;
      ocx.strHxNptIp = "";
      ocx.strPicSaveDir = "C:"; //截图保存路径
      ocx.strFileSaveDir = "C:"; //录像保存路径
      ocx.intRClkbtnShow = 63;
      ocx.bIsShowCapture = 0; //右键菜单截图是否弹出窗口显示当前截图  0-否；1-是
      ocx.apiSetTitleFont(0.1, 0.8, 255, "微软雅黑", -29, 500, 3, 0, 0); //设置叠加自定义字符串的显示位置、字体、颜色等信息
      ocx.apiEnableRealCache(1, 30); //启用、禁用实时流缓存功能   1-启用；0-禁用  实时流缓存时间设置，单位：秒；最多不超过 60 秒
      ocx.intIsFullOnDblclk = 1;   //启用双击播放器全屏
      return ocx;
    } catch (e) {
      console.warn("initOcx_ys", e);
      return null;
    }
  }

  getRGB(r: number, g: number, b: number): any {
    return r | (g << 8) | (b << 16);
  }

  /***
   * 设置播放器窗口的样式
   * @param ocxobj
   * @param {number} wnum
   */
  setMyocxUi(ocxobj: any, wnum: number): void {
    try {
      /* 设置logo透明色 */
      ocxobj.LogoTransparentColor = this.getRGB(216, 231, 241);
      /* 设置播放器背景色  --- #09112B  */
      ocxobj.playerBackgroundColor = this.getRGB(9, 17, 43);
      /* 设置播放器边框颜色  #40BFE6 */
      ocxobj.playerBorderColor = this.getRGB(64, 191, 230);
      /* 设置播放器字体颜色 #06EAE7 */
      ocxobj.playerFontColor = this.getRGB(6, 205, 206);
      /* 启用logo  ocx 目录下logo.bmp，可以替换图片内容，名字格式固定*/
      ocxobj.intIsEnableLogo = 0;
      /* 启用加载中动图效果,图片在ocx目录下的 图片，gif图片
      * 这里注意: loading.gif图片的背景色应当换成与 playerBackgroundColor 属性一致,否则加载中图片效果不一致
      * 这里loading.gif不使用透明gif的原因时，是用透明gif的效果不大理想(锯齿)
      */
      ocxobj.intIsEnableLoading = 1;
      ocxobj.apiSetLoadingGIF("loading-black.gif");
      ocxobj.apiSetView(wnum);
    } catch (e) {
      console.warn("setMyocxUi", e);
    }

  }

  /**
   * 设置播放器大小，并且指定播放画面数
   * @param ocxobj
   * @param {number} ocx_w
   * @param {number} ocx_h
   * @param {number} wnum
   */
  public setOcxsizeAndwnum(ocxobj: any, ocx_w: number, ocx_h: number, wnum: number): void {
    try {
      ocxobj.width = ocx_w + "px";
      ocxobj.height = ocx_h + "px";
      ocxobj.intWidth = ocx_w;
      ocxobj.intHeight = ocx_h;
      ocxobj.apiSetView(wnum);
    } catch (e) {
      console.warn("setOcxsizeAndwnum", e);
    }
  }

  /**
   * 设置播放器的，画面数
   * @param ocxobj
   * @param {number} wnum
   */
  public setOcxwnum(ocxobj: any, wnum: number): void {
    try {
      ocxobj.apiSetView(wnum);
    } catch (e) {
      console.warn("setOcxwnum", e);
    }
  }

  /**
   * 设置 自定义右键菜单的菜单项目
   * @param ocxobj
   * @param {string} menustr
   */
  public setCustmenu(ocxobj: any, menustr: string): void {
    try {
      ocxobj.apiSetCustomMenu(menustr);
      ocxobj.bCustomMenuOn = 1;
      ocxobj.intIsMenuOn = 1;
    } catch (e) {
      console.warn("setCustmenu", e);
    }
  }

  /**
   * 修改自定义菜单的项目
   * @param ocxobj
   * @param {number} itemindex  菜单位置  从 0开始
   * @param{string} newstr  菜单项新值
   * @param flag 菜单项属性
   * MF_ENABLED 0 启用
   MF_GRAYED 1 灰色
   MF_DISABLED 2 不可用
   MF_UNCHECKED 0 未打钩
   MF_CHECKED 8 打钩选择
   */
  public updataMenuItem(ocxobj: any, itemindex: number, flag: any, newstr: string): void {
    try {
      ocxobj.apiModifyCustomMenu(itemindex, flag, newstr);
    } catch (e) {
      console.warn("updataMenuItem", e);
    }
  }


  /**
   * 获取 播放窗口  initw的播放状态
   * @param ocxobj
   * @param {number} initw   播放器窗口编号，从1开始计数；
   * @returns {any}
   * 失败返回null，成功返回播放器对象
   *intIsPlaying   0-未播放，1-播放中
   * intPlayingMode   0 实时流，1 网络文件，2 本地文件
   * strPlayingDeviceID ---sipurl
   * intIsRecording 0-未录像，1-录像中
   */
  public getPlayInfo(ocxobj: any, initw: number): any {
    let retobj = null;
    try {
      const ret = ocxobj.apiGetPlayerInfo(initw);
      if (ret === 0) {
        retobj = ocxobj;
      }
    } catch (e) {
      console.warn("getPlayInfo", e);
    }
    return retobj;
  }

  /**
   * 播放实时流
   * @param ocxobj
   * @param o
   */
  public play_stream(ocxobj: any, o: any): void {
    const ip = o["ip"];
    const port = o["port"];
    const sipurl = o["sipurl"];
    const playwnum = o["playwnum"];  // 从1 开始计数
    const proto = 0;////打开流协议 ，0--http  1-rtsp
    const username = "admin";
    const password = "123456";
    //关闭，再打开
    this.closeplay(ocxobj, playwnum);
    try {
      const ret = ocxobj.apiPlayStream(ip, port, sipurl, playwnum, proto, username, password);
      if (ret < 0) {
        //alert("打开视频流失败");
      }
    } catch (e) {
      console.warn("play_stream", e);
    }
  }

  /**
   * 关闭实时流
   * @param ocxobj
   * @param {number} initw   // 从1 开始计数
   */
  public closeplay(ocxobj: any, initw: number): void {
    try {
      ocxobj.apiCloseStream(initw);//1 关闭成功，-1 窗口超出边界
    } catch (e) {
      console.warn("closeplay", e);
    }
  }

  /**
   * 关闭所有实时流
   * @param ocxobj
   * @param {number} wincount
   */
  public closeAllPlay(ocxobj: any, wincount: number): void {
    const that = this;
    for (let k = 1; k <= wincount; k++) {
      this.closeplay(ocxobj, k); // 全部关闭
    }
  }


  /**
   * 播放历史网络文件
   * @param ocxobj
   * @param o
   *    * serverIp--服务器ip
   * port---服务器端口
   * sipurl---目标设备的 id
   * winindex---播放用的窗口序号， 从1 开始
   * openxy---打开流协议，0-HTTP，1-RTSP。
   * startime---文件开始时间，格式必须为    yyyy-mm-dd HH:MM:SS
   * endtime---文件结束时间,格式必须为    yyyy-mm-dd HH:MM:SS
   * filetype---文件类型，1-定时录像；2-报警录像；4-手动录像。
   * uname---用户名，服务器启用认证时必须填写（目前 SDK 暂未支持认证）。
   * upass---用户密码 服务器启用认证时必须填写（目前 SDK 暂未支持认证）。
   * @returns {any}
   *1 成功
   -1 参数错误
   -2 请求文件回放失败
   -3 创建播放器失败
   */
  public playHisfile(ocxobj: any, o: any): any {
    let ret = 0;
    const serverIp = o["serverIp"];
    const port = o["port"];
    const sipurl = o["sipurl"];
    const winindex = Number(o["winindex"]);
    const openxy = o["openxy"];
    const startime = o["startime"];
    const endtime = o["endtime"];
    const filetype = o["filetype"];
    try {
      ret = ocxobj.apiPlayBack(serverIp, port, sipurl, winindex, openxy, startime, endtime, filetype, "admin", "111111");
    } catch (e) {
      console.warn("playHisfile", e);
    }
    return ret;
  }

  /**
   * 停止播放历史网络文件
   * @param ocxobj
   * @param {number} winindex   播放用的窗口序号， 从1 开始
   */
  public stopplayHisfile(ocxobj: any, winindex: number): void {
    try {
      ocxobj.apiStopPlayback(winindex);
    } catch (e) {
      console.warn("stopplayHisfile", e);
    }
  }

  /**
   * 播放本地文件
   * @param o
   * @returns {any}
   * intWindow----从1开始
   * strFilePath---本地文件路径
   * 1 成功
   *-1 文件路径错误
   * -2 窗口编号错误或者窗口正在播放其他视频
   */
  /**
   * 播放本地文件
   * @param ocxobj
   * @param o
   * @returns {any}
   * 1 成功
   * -1 文件路径错误
   * -2 窗口编号错误或者窗口正在播放其他视频
   */
  public play_localfile(ocxobj: any, o: any): any {
    let ret = 0;
    const playwin = o["playwin"]; // 从1开始
    const filepath = o["filepath"];  // 本地文件路径
    try {
      ret = ocxobj.apiPlayLocalFile(playwin, filepath);
    } catch (e) {
      console.warn("play_localfile", e);
    }
    return ret;
  }

  /**
   *
   * @param ocxobj
   * @param o
   * @returns {any}
   */
  public play_rtspstream(ocxobj, o: any): any {
    const rtspurl = o["rtspurl"];
    const playwindex = o["windex"];  // 从1 开始
    const strUserName = "";
    const strPassword = "";
    const isTCP = 1; // 0--UDP 1-TCP
    try {
      const r = ocxobj.apiPlayRTSPStream(rtspurl, playwindex, strUserName, strPassword, isTCP);
    } catch (e) {

    }
  }


  /**
   * 截图（弹框）
   * @param ocxobj
   * @param {number} initw   从1开始计数
   */
  public pictureEx(ocxobj: any, initw: number): void {
    try {
      const r = ocxobj.apiCapturePlayerEx(initw);
      if (r == 1) {
        //alert("截图成功!");
      } else {
        // alert("截图失败!");
      }
    } catch (e) {
      console.warn("pictureEx", e);
    }
  }


  /**
   * 录像   （弹框）
   * @param ocxobj
   * @param {number} initw    从1开始计数
   */
  public videoEx(ocxobj: any, initw: number): number {
    let r = -1;
    try {
      const r = ocxobj.apiBeginDumpEx(initw);
      if (r == 1) {
        //alert("录像成功!");
      } else {
        //alert("录像失败!");
      }
    } catch (e) {
      console.warn("videoEx", e);
    }
    return r;
  }


  /**
   * 停止录像
   * @param ocxobj
   * @param {number} initw   从1开始计数
   */
  public closevideoEx(ocxobj: any, initw: number): number {
    let r = -1;
    try {
      const r = ocxobj.apiStopDump(initw);
      if (r == 1) {
        //alert("停止录像成功");
      } else {
        // alert("停止录像失败");
      }
    } catch (e) {
      console.warn("closevideoEx", e);
    }
    return r;
  }


  /**
   * 查询网络文件列表
   * @param ocxobj
   * @param o
   * @returns {any}
   */
  public queryNetFile(ocxobj: any, o: any): any {
    let fileid: any = 0;
    const ip = o["ip"];
    const port = o["port"];
    const sip = o["sip"];
    const query_btime = o["btime"];//查询开始时间， 格式必须是 yyyy-mm-dd HH:MM:SS
    const query_etime = o["etime"];//查询结束时间，格式必须是 yyyy-mm-dd HH:MM:SS
    const query_filetype = o["filetype"];// 文件类型，1-定时录像；2-报警录像；4-手动录像；7-全部录像。
    const username = "hisome";
    const pswd = "hisome123456";
    try {
      const filecount = ocxobj.apiQueryFileV2(ip, port, sip, query_btime, query_etime, query_filetype, username, pswd);
      if (filecount > 0) {
        fileid = filecount
      } else if (filecount == 0) {
        //alert("查询超时");
      } else {
        //alert("查询失败");
      }
    } catch (e) {
      console.warn("queryNetFile", e);
    }
    return fileid;
  }


  /**
   * 网络文件列表中文件详情
   * @param ocxobj
   * @param {number} index ， 文件id值。   取值范围： 0 到 apiQueryFile()返回文件数量减1
   * @returns {any}
   * strFileName、
   * sStartTime、
   * sEndTime、
   * strFileSize
   * sFileType
   */
  public getfileinfo(ocxobj: any, index: number): any {
    let retobj = null;
    try {
      const ret = ocxobj.apiGetFileInfo(index);
      if (ret === 1) {
        retobj = ocxobj;
      }
    } catch (e) {
      console.warn("getfileinfo", e);
    }
    return retobj;
  }


  /**
   * 下载网络历史文件到本地
   * @param ocxobj
   * @param o
   * @returns {any}
   */
  public downnetfile(ocxobj: any, o: any): void {
    const serverIp = o["streamip"];
    const port = o["streamport"];
    const sipurl = o["sip"];
    const savePath = o["savepath"];
    const openxy = 0;//打开流协议，0-HTTP，1-RTSP。
    const startime = o["dstime"];//文件开始时间  yyyy-mm-dd HH:MM:SS
    const endtime = o["detime"];//文件结束时间    yyyy-mm-dd HH:MM:SS
    const filetype = o["filetype"];//文件类型，1-定时录像；2-报警录像；4-手动录像
    try {
      ocxobj.strFileAttr = 'ab'; //只读的方式，二进制写文件，允许追加（文件名要一样）
      ocxobj.apiDownload(serverIp, port, sipurl, savePath, openxy, startime, endtime, filetype);
    } catch (e) {
      console.warn("downnetfile", e);
    }
  }

  /**
   * 下载文件的进度信息
   * @param ocxobj
   * @param taskid
   * @returns {any}
   *intSpeed、  秒
   * ingFileTime
   */
  public getdownInfo(ocxobj: any, taskid: any): any {
    let retobj = null;
    try {
      const r = ocxobj.apiGetDownloadInfo(taskid);
      if (r === 1) {
        retobj = ocxobj;
      }
    } catch (e) {
      console.warn("getdownInfo", e);
    }
    return retobj;
  };


  /**
   * 播放控制
   * @param {number} initw     播放器窗口编号(从1开始计数),只有正在播放的窗口方可控制;
   * @param {number} flag
   * @constructor
   */
  public VoiceCtr(ocxobj, initw: number, flag: number): void {
    if (flag == 1) {
      try {
        const r = ocxobj.apiPlayBackCtrl(initw, 107, 0);
        if (r == 1) {
          //alert('打开声音成功');
        } else {
          //alert('打开声音失败');
        }
      } catch (e) {
        console.warn("VoiceCtr---开启声音", e);
      }
    } else if (flag == 0) {
      try {
        const r = ocxobj.apiPlayBackCtrl(initw, 108, 0);
        if (r == 1) {
          //alert('关闭声音成功');
        } else {
          // alert('关闭声音失败');
        }
      } catch (e) {
        console.warn("VoiceCtr--关闭声音", e);
      }
    } else {
      try {
        const r = ocxobj.apiPlayBackCtrl(initw, 109, flag);
        if (r == 1) {
          //alert('关闭声音成功');
        } else {
          //alert('关闭声音失败');
        }
      } catch (e) {
        console.warn("VoiceCtr---设置声音值", e);
      }
    }
  }

  /**
   * 获取已经播放的录像文件时长
   * @param ocxobj
   * @param initw
   * @returns {any}
   */
  public getplayTime(ocxobj, initw): any {
    let ret;
    try {
      ret = ocxobj.apiPlayBackCtrl(initw, 111, 0);
    } catch (e) {

    }
    return ret;
  }

  /**
   * 播放器 全屏显示
   * @param ocxobj
   * @param {number} win   从1 开始
   */
  bigwin(ocxobj: any, win: number): void {
    try {
      ocxobj.apiScreenFull(win);
    } catch (e) {
      console.warn("bigwin", e);
    }
  }

  /**
   * 退出 播放器全屏状态
   * @param ocxobj
   * @param win  从1 开始
   */
  closebigwin(ocxobj: any, win): void {
    try {
      ocxobj.apiScreenRestore(win);
    } catch (e) {
      console.warn("closebigwin", e);
    }
  }

  constructor() {

  }
}
